# @Time : 2024/10/25 23:35
# @Author : Fioman 
# @Phone : 13149920693

"""
staticmethod: 静态方法,就是普通的方法放到了类中. 对第一个参数没有要求
classmethod: 类方法,类方法,第一个参数是必须是cls,就是类对象
它们之间功能上区别不是很大,因为静态方法和类想法都可以通过类或者实例来调用,并且,不需要实例化就可以
调用,在静态方法中也可以访问类变量和类方法,在类方法中也可以访问类变量和类方法,区别可能就是在静态方法
中需要知道具体的类名,比如Person.ClassVal Person.ClassMethod 而在类方法中可以使用cls这个参数来
调用类方法和类变量
cls.ClassVal,cls.ClassMethod
"""


class Person:
    totalMoney = 0  # classVal

    def __init__(self, name, money):
        self.name = name
        self.money = money
        Person.totalMoney += money

    @classmethod
    def show_money(cls):
        print("类方法,直接可以访问类变量: {}".format(cls.totalMoney))

    @staticmethod
    def show_money_static():
        print("静态方法,需要使用类名才能访问类变量: {}".format(Person.totalMoney))

    def show_money_normal(self):
        print("普通的方法,需要类名才能访问类变量: {}".format(Person.totalMoney))


p = Person("Fioman", 100)
p.show_money()  # 实例对象也可以调用类方法
p.show_money_normal()  # 实例对象也调用实例方法
p.show_money_static()  # 实例对象还可以调用静态方法

Person.show_money()
Person.show_money_static()
# Person.show_money_normal() # 不能调用,类不能直接调用实例方法
